#include <cstring>
#include <iostream>
using namespace std;

int a[2100], c[2100],
    dp[2100]; // a数组存储每个位置的权值，c数组存储跳跃范围，
// dp数组 dp[i], 第i号碗中的豆子导入 0好碗，最小步数

int main() {
  int n;
  cin >> n; // 输入位置数量

  // 初始化dp数组为极大值
  memset(dp, 0x7f, sizeof dp);

  // 读取每个位置的跳跃范围c[i]
  for (int i = 1; i < n; i++) {
    cin >> c[i];
  }

  // 读取每个位置的权值a[i]
  for (int i = 1; i < n; i++) {
    cin >> a[i];
  }

  dp[0] = 0; // 初始位置步数为0

  // 动态规划
  /*   对于每个碗i，检查可以从前c[i] 个碗(j ∈ [i - c[i], i - 1]) 转移过来
    如果j碗本身有豆子(a[j] = 1)，则可以直接将i碗的豆子倒入j碗(操作次数 = 1)
    如果j碗没有豆子，则需要先将j碗的豆子移动到0号碗(   dp[j]
    次)，再将i碗的豆子倒入j碗(+1次) */
  for (int i = 1; i < n; i++) {
    // 检查当前位置i可以从前c[i]个位置跳跃过来
    for (int j = i - c[i]; j <= i - 1; j++) {
      // 如果j位置有豌豆(a[j]为真)，则dp[i]=1
      // 否则取j位置的步数+1
      dp[i] = min(dp[i], a[j] ? 1 : dp[j] + 1);
    }
  }

  // 计算所有有权值位置的最小步数之和
  int s = 0;
  for (int i = 1; i < n; i++) {
    if (a[i]) {
      s += dp[i];
    }
  }

  cout << s; // 输出结果
  return 0;
}